<?php
// При подключении модуля также подключаем, если надо, механизм определения прав пользователя на разделы
if($protected_access){
	include_once $common_data_server."lib/php/auth.php";
}

class menu extends module{
function get_hash_code(){
	if($this->version==1)return 0;
    $all_params=$this->page_id.$this->block_id.$this->lang_id." {$_COOKIE['client_id']} {$_COOKIE['random_number']}";
	foreach($this->view_param as $k=>$vp)
       	$all_params.=$k.$vp;
    if(is_array($this->q_param))
        foreach($this->q_param as $k=>$vp)
   	    	$all_params.=$k.$vp;
	return md5($all_params);    
}
function make_arrays(){ 
	global $protected_access;
	if($this->view_param["view_mode"]==4){
		$pages=sql_select("SELECT * FROM PAGE WHERE SITE_ID=".$this->site_id." AND VERSION=".$this->version." AND LANG_ID=".$this->lang_id." ORDER BY PAGE_ORDER");
	}else{
		$pages=sql_select("SELECT * FROM PAGE WHERE SITE_ID=".$this->site_id." AND VERSION=".$this->version." AND (IS_MENU_PUBLISHED=1 OR PARENT_ID=0) AND LANG_ID=".$this->lang_id." ORDER BY PAGE_ORDER");
	}

	if($protected_access){
		$is_authorized=check_autorization(); // см. $common_data_server."lib/php/auth.php"
	}

    foreach($pages as $pgs){
    	if($protected_access && $pgs["IS_PROTECTED"] && $this->view_param["view_mode"]!=4){ // Проверка прав пользователя на раздел
			if($is_authorized){
				$rights=check_rights_on_page($pgs["PAGE_ID"],1,$this->version,$this->site_id,$this->lang_id); // см. $common_data_server."lib/php/auth.php"
			}else{
				$rights=0;
			}
		}else{
			$rights=1;
		}
		if($rights){
			$this->page_id_array[$pgs["PAGE_ID"]]=$pgs;// Этот массивчик для того, чтобы хорошо было лезть вверх по дереву
		    $this->parent_id_array[$pgs["PARENT_ID"]][]=$pgs; // А этот для того, чтобы вниз
		}
    }
	// Собираем путь до корня
    $cur=$this->page_id;
   	$this->up_path[]=$cur;
    while($this->page_id_array[$cur]["PARENT_ID"]!=0){
	    $cur=$this->page_id_array[$cur]["PARENT_ID"];
   		$this->up_path[]=$cur;
    }
	foreach($this->up_path as $tup){ // Собираем аналог page_id_array для пути до корня, а заодно сделаем и путь до родителя страницы
    	$this->up_path_by_id[$tup]=1;
        if($tup!=$this->page_id && $tup!=0)$this->parent_dir=$this->page_id_array[$tup]["DIR_NAME"]."/".$this->parent_dir;
    }
	$this->parent_dir="/".$this->parent_dir;
}
function get_level_array($page_id,$level) { // Warning! Рекурсия! Передаются айдишник родителя уровня и номер уровня для сравнения с глубиной
	$level_array=array();
    $this->level_dir[$level]=$this->level_dir[$level-1].$this->page_id_array[$page_id]["DIR_NAME"]."/";
	if(is_array($this->parent_id_array[$page_id])){
		foreach($this->parent_id_array[$page_id] as $item){
			if($item["URL"]!=""){
				$url=$item["URL"];
				$is_link=1;
			}else{
				$url=$this->level_dir[$level].$item["DIR_NAME"]."/";
				$is_link=0;
			}
	        if($this->up_path_by_id[$item["PAGE_ID"]]==1){
		    	$selected=1;
			    $is_children=1;
	        }
		   	else{
			    $selected=0;
				$is_children=0;
	        }
		   	if($this->view_param["view_mode"]==3 || $this->view_param["view_mode"]==5){
				$is_children=1;
			}
			if($is_children==1 && $level<$this->view_param["depth"] && is_array($this->parent_id_array[$item["PAGE_ID"]])) {
           		$children=$this->get_level_array($item["PAGE_ID"],$level+1);
	        }
		   	else {
			    $children=0;
				$is_children=0;
	        }
			if($item["PAGE_ID"]==$this->page_id){
				$current=1;
			}else{
				$current=0;
			}

			$item["ITEM_NAME"]=$item["NAME"];
			$item["URL"]=$url;
			$item["IS_CHILDREN"]=$is_children;
			$item["SELECTED"]=$selected;
			$item["CURRENT"]=$current;
			$item["CHILDREN$level"]=$children;
			if(!$is_link || ($is_link && $this->view_param["view_mode"]!=5))array_push($level_array,$item);
	    }
	}
	return $level_array;
}
function content_init()	{
    global $common_data_server;
    if($this->view_param["view_mode"]==1)$file_name="menu.vtmpl";
    if($this->view_param["view_mode"]==2)$file_name="center_menu.vtmpl";
    if($this->view_param["view_mode"]==3)$file_name="children_menu.vtmpl";
    if($this->view_param["view_mode"]==4)$file_name="status.vtmpl";
    if($this->view_param["view_mode"]==5)$file_name="map.vtmpl";
    $file_name=$common_data_server."module_templates/menu/".$this->view_param["template"]."/".$file_name;
    if(file_exists($file_name))	{
        $content_tmpl=new vlibTemplate();
		$content_tmpl->newTemplate($file_name);
    }
	else {
        $this->body="Шаблон отсутствует: ".$file_name;
        return;
	}
    $this->make_arrays();
// Переход на дочерний раздел
	if($this->page_id_array[$this->page_id]["IS_FOLDER"] && $this->parent_id_array[$this->page_id][0]["DIR_NAME"]!=""){
		header("Location: {$this->parent_id_array[$this->page_id][0]["DIR_NAME"]}/");
		exit();
	}
//    
    if(!is_numeric($this->view_param["depth"]) || $this->view_param["depth"]<1 || $this->view_param["depth"]>10)$this->view_param["depth"]=2;
    if($this->view_param["view_mode"]==1){
		$this->level_dir[0]="/";
        $menu_array=$this->get_level_array($this->parent_id_array[0][0]["PAGE_ID"],1);
	}
    if($this->view_param["view_mode"]==2){
		$this->level_dir[999]=preg_replace("/\/[^\/]*\/$/","/",$this->parent_dir);// А тут такое извращение, чтобы взять директорию не родителя, а родителя родителя
        $menu_array=$this->get_level_array($this->page_id_array[$this->page_id]["PARENT_ID"],1000);// 999 и 1000 для того, чтобы заведомо перекрыть максимальную глубину, установленную в 10 и скрипт не полезет из-за этого в подпункты
	}
    if($this->view_param["view_mode"]==3){
		$this->level_dir[0]=$this->parent_dir;
        $menu_array=$this->get_level_array($this->page_id,1);
	}
    if($this->view_param["view_mode"]==4){
        $rev_up_path=array_reverse($this->up_path,TRUE);
        $length=strlen($this->page_id_array[$this->up_path[0]]["NAME"])+strlen($this->page_id_array[$rev_up_path[0]]["NAME"]);
		for($i=1;$i<count($this->up_path)-1;$i++){
	        $length+=strlen($this->page_id_array[$this->up_path[$i]]["NAME"]);
    	    if($length<=$this->view_param["status_length"])$possible[$i]=1;
        }
        $menu_array=array();
		$url="/";
        foreach($rev_up_path as $k=>$rup){
   			$url.=$this->page_id_array[$rup]["DIR_NAME"]."/";
        	if($possible[$k]==1 || $k==0 || $k==count($this->up_path)-1)array_push($menu_array,array("ITEM_NAME"=>$this->page_id_array[$rup]["NAME"],"URL"=>$url));
			if($possible[$k]!=1 && $k!=0 && $k!=count($this->up_path)-1 && !$faked){
            	array_push($menu_array,array("ITEM_NAME"=>".."));
                $faked=1;
            }
        }
	}
    if($this->view_param["view_mode"]==5){
		$this->level_dir[0]="/";
        $menu_array=$this->get_level_array($this->parent_id_array[0][0]["PAGE_ID"],1);
	}
	$content_tmpl->setLoop("ITEMS",$menu_array);
    $this->body=$content_tmpl->grab();
}
}
?>